#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
学生页面处理器
提供从学生页面提取信息和导航到评教页面的功能
"""

import os
import sys
import logging
import time
import re
from typing import Dict, Any, Optional

# 添加项目根目录到路径
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

# 导入JSON处理器
from .json_handler import JsonHandler

# 设置日志
logger = logging.getLogger(__name__)

class StudentPageHandler:
    """
    学生页面处理器
    提供从学生页面提取信息和导航到评教页面的功能
    """
    
    def __init__(self, page):
        """
        初始化学生页面处理器
        
        Args:
            page: DrissionPage页面对象
        """
        self.page = page
        self.logger = logger
        self.json_handler = JsonHandler("screenshots")
    
    def set_json_handler(self, json_handler):
        """
        设置JSON处理器
        
        Args:
            json_handler: JSON处理器对象
        """
        self.json_handler = json_handler
    
    def get_student_info(self):
        """
        获取学生信息
        
        Returns:
            dict: 学生信息字典
        """
        return self._parse_student_info()
    
    def _parse_student_info(self):
        """
        从学生页面解析学生信息
        
        Returns:
            dict: 学生信息字典
        """
        # 创建基本学生信息字典
        student_info = {"name": "", "id": ""}
        
        try:
            # 从URL提取学号信息
            try:
                if "?" in self.page.url:
                    url_parts = self.page.url.split("?")[0].split("/")
                    if len(url_parts) > 0:
                        student_info["id"] = url_parts[-1]
            except Exception:
                pass
            
            # 学生姓名相关提取逻辑已删除
            
            # 保存学生信息
            if self.json_handler:
                self.json_handler.save_student_info(student_info)
            
        except Exception:
            pass
            
        return student_info
    
    def _navigate_to_evaluation(self):
        """
        导航到评教页面
        """
        try:
            # 查找评教入口 - 关键是.box2下面的.wwc元素才是真正的入口
            evaluation_link = self.page.ele("css:.box2 .wwc[data-dlg='unfinish']")
            
            # 如果没找到，尝试查找其他可能的入口
            if not evaluation_link:
                evaluation_link = self.page.ele("css:.box2#pjrw .wwc")
            
            # 如果还是没找到，尝试更通用的选择器
            if not evaluation_link:
                evaluation_link = self.page.ele("css:div[class='wwc']")
            
            # 如果找到了评教入口
            if evaluation_link:
                # 在点击之前先提取课程评教数据
                self._extract_main_page_data(log_details=False)
                
                evaluation_link.click()
                time.sleep(0.8)  # 等待页面加载，改为800毫秒
                
                # 解析评教任务信息
                self._parse_evaluation_tasks()
                
                # 保存导航后的页面截图
                timestamp = time.strftime("%Y%m%d%H%M%S")
                screenshot_path = os.path.join("screenshots", f"evaluation_page_{timestamp}.png")
                self.page.save_screenshot(screenshot_path)
                
                # 检查是否进入了评教任务列表页面
                course_table = self.page.ele("css:table.listTable, table.data_table")
                if course_table:
                    # 尝试提取评价链接
                    evaluate_link = self.page.ele("css:table a[href*='evaluate']")
                    if evaluate_link:
                        # 保存当前URL，用于可能需要返回
                        course_list_url = self.page.url
            else:
                # 尝试查找评教文本
                evaluation_text = self.page.ele("css:p:contains('评教')")
                if evaluation_text:
                    # 找到p元素之后，查找其后的.box2 .wwc元素
                    box_elem = evaluation_text.next_ele("css:.box2")
                    if box_elem:
                        # 在点击之前先提取课程评教数据
                        self._extract_main_page_data(log_details=False)
                        
                        wwc_elem = box_elem.ele("css:.wwc")
                        if wwc_elem:
                            wwc_elem.click()
                            time.sleep(0.8)  # 等待页面加载，改为800毫秒
                            
                            # 解析评教任务信息
                            self._parse_evaluation_tasks()
                            
                            # 保存截图
                            timestamp = time.strftime("%Y%m%d%H%M%S")
                            screenshot_path = os.path.join("screenshots", f"evaluation_page_from_box_{timestamp}.png")
                            self.page.save_screenshot(screenshot_path)
        
        except Exception:
            pass
    
    
    def _parse_evaluation_tasks(self):
        """
        解析评教任务信息
        """
        try:
            # 查找评教说明文本
            instruction_elems = self.page.eles("css:.mainBox p, .mainBox .desc")
            
            # 创建任务信息字典
            tasks_info = {
                "title": "学生评教任务",
                "description": [],
                "tasks": []
            }
            
            # 提取说明文本
            for elem in instruction_elems:
                text = elem.text.strip()
                if text:
                    tasks_info["description"].append(text)
            
            # 查找评教任务列表
            task_list = self.page.eles("css:table tr")
            
            # 如果找到，提取每个任务的信息
            if task_list:
                for i, task in enumerate(task_list[1:]):  # 跳过表头
                    cells = task.eles("tag:td")
                    if cells and len(cells) >= 3:
                        task_info = {
                            "id": f"task_{i+1}",
                            "name": cells[0].text.strip(),
                            "type": cells[1].text.strip() if len(cells) > 1 else "",
                            "status": cells[-1].text.strip() if len(cells) > 2 else ""
                        }
                        tasks_info["tasks"].append(task_info)
            
            # 保存评教任务信息
            if self.json_handler:
                self.json_handler.save_evaluation_tasks(tasks_info)
            
        except Exception:
            pass
    
    def _extract_main_page_data(self, log_details=True):
        """
        提取主页上的课程评教数据
        """
        try:
            # 查找课程数据元素
            data_elements = self.page.eles("css:.row.box2")
            
            course_data = []
            
            # 提取每个课程块的数据
            for i, element in enumerate(data_elements):
                heading = element.ele("tag:h5")
                title = heading.text.strip() if heading else f"课程区块 {i+1}"
                
                # 提取所有的链接或文本元素
                items = element.eles("css:.wwc, .box-content a")
                
                block_data = {
                    "title": title,
                    "items": []
                }
                
                for item in items:
                    item_text = item.text.strip()
                    item_href = item.attr("href") if item.tagname == "a" else ""
                    
                    if item_text:
                        block_data["items"].append({
                            "text": item_text,
                            "link": item_href
                        })
                
                if block_data["items"]:
                    course_data.append(block_data)
            
            return course_data
            
        except Exception:
            pass
            
        return [] 